/**
 * @author LKQ
 * @date 2021/12/23 16:18
 * @description 既然存在环，那么就可以使用快慢指针的方法
 */
public class FormalSolution2 {
    public static void main(String[] args) {
        FormalSolution2 formalSolution2 = new FormalSolution2();
        formalSolution2.isHappy(2);
    }

    /**
     * 同样获取数n的下一个数字
     * @param n n
     * @return 每位数字上的平方和。
     */
    public int getNext(int n) {
        int totalSum = 0;
        while (n > 0) {
            int d = n % 10;
            n = n / 10;
            totalSum += d * d;
        }
        return totalSum;
    }

    /**
     * 判断一个数是否为快乐数
     * @param n 初始值n
     * @return 是否为快乐数
     */
    public boolean isHappy(int n) {
        // 跑的慢的初始值为n，跑的快的初始值为n的下一个
        int slowRunner = n;
        int fastRunner = getNext(n);
        // 如果兔子先到1，那么说明是快乐数，如果兔子最后追上了乌龟，说明存在循环，不是快乐数。
        while (fastRunner != 1 && slowRunner != fastRunner) {
            // 乌龟每次跑一步
            slowRunner = getNext(slowRunner);
            // 兔子每次跑两步
            fastRunner = getNext(getNext(fastRunner));
        }
        return fastRunner == 1;
    }
}
